<?php

/**
 * Classe : Entreprise
 * @version 1.0
 * @author Jeremy
 * @author Alexia
 */
class Entreprise
{

    /**
     * @var int
     */
    protected $Id;
    /**
     * @var string
     */
    protected $Nom;
    /**
     * @var string
     */
    protected $Adresse1;
    /**
     * @var string
     */
    protected $Adresse2;
    /**
     * @var string
     */
    protected $Ville;
    /**
     * @var string
     */
    protected $Mail;
    /**
     * @var string
     */
    protected $Site;
    /**
     *
     * @var int
     */
    protected $IdZone;
    /**
     * @var string
     */
    protected $Description;
    /**
     * @var string
     */
    protected $Tel;
    /**
     * @var int
     */
    protected $CP;

    /**
     * @param int $id
     */
    public function __construct($id = 0)
    {
        if (empty($id))
        {
            //Id
            $this->Id = 0;

            //String
            $this->Nom = "";
            $this->Adresse1 = "";
            $this->Adresse2 = "";
            $this->Ville = "";
            $this->IdZone = 0;
            $this->Mail = "";
            $this->Site = "";
            $this->Description = "";
            $this->Tel = "";

            //Int
            $this->CP = 0;

            $this->requeteOk = true;
            $this->errormsg = "";
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            $query = '	SELECT * 
						FROM Entreprise 
						WHERE IdEntreprise = :id
					';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $id, PDO::PARAM_INT);
            //Execution de la requête retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    //ID
                    $this->Id = $result->IdEntreprise;

                    //String
                    $this->Nom = $result->NomEntreprise;
                    $this->Adresse1 = $result->Adresse1Entreprise;
                    $this->Adresse2 = $result->Adresse2Entreprise;
                    $this->Ville = $result->VilleEntreprise;
                    $this->Mail = $result->MailEntreprise;
                    $this->Site = $result->SiteEntreprise;
                    $this->IdZone = $result->IdZone;
                    $this->Description = $result->DescriptionEntreprise;
                    $this->Tel = $result->TelephoneEntreprise;

                    //Int
                    $this->CP = $result->CPEntreprise;

                    $this->requeteOk = true;
                    $this->errormsg = "";
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = "Cette entreprise n'existe pas !";
                }
            }
            else
            {
                //Recuperation de l'erreur dans la variable de classe
                /*
                  Pour chaque new avec passage de paramètres vous pouvez savoir si vous avez bien un resultat, si false n'oubliez pas de gerez l'affichage du message,...
                 */
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
            }
        }
    }

    /**
     * Insert une nouvelle entreprise dans la base
     */
    public function insertEntreprise()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'INSERT INTO Entreprise
		(
			 NomEntreprise,
			 Adresse1Entreprise,
			 Adresse2Entreprise,
             VilleEntreprise,
             IdZone,
             MailEntreprise,
             SiteEntreprise,
             DescriptionEntreprise,
             TelephoneEntreprise,
             CPEntreprise
		)
		VALUES
		(
			:nom,
			:ad1,
			:ad2,
            :vil,
            :idZ,
            :ma,
            :si,
            :des,
            :tel,
            :cp
		)';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);

            $c->bindParam(':nom', $this->Nom, PDO::PARAM_STR);
            $c->bindParam(':ad1', $this->Adresse1, PDO::PARAM_STR);
            $c->bindParam(':ad2', $this->Adresse2, PDO::PARAM_STR);
            $c->bindParam(':vil', $this->Ville, PDO::PARAM_STR);
            $c->bindParam(':ma', $this->Mail, PDO::PARAM_STR);
            $c->bindParam(':si', $this->Site, PDO::PARAM_STR);
            $c->bindParam(':des', $this->Description, PDO::PARAM_STR);
            $c->bindParam(':tel', $this->Tel, PDO::PARAM_STR);

            $c->bindParam(':cp', $this->CP, PDO::PARAM_INT);
            $c->bindParam(':idZ', $this->IdZone, PDO::PARAM_INT);

            if ($c->execute())
            {
                $this->Id = $sql->lastInsertId();
                $sql->commit();
                $c->closeCursor();
                $this->requeteOk = true;
                $this->errormsg = "Insertion reussie!";
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
                $this->Id = 0;
            }
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
            $this->Id = 0;
        }
    }

    /**
     * Met à jour une entreprise dans la base
     */
    public function updateEntreprise()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'UPDATE Entreprise
		SET
			 NomEntreprise              = :nom,
			 Adresse1Entreprise         = :ad1,
             Adresse2Entreprise         = :ad2,
			 VilleEntreprise            = :vil,
                         IdZone                     = :idZ,
			 MailEntreprise             = :ma,
             SiteEntreprise             = :si,
			 DescriptionEntreprise      = :des,
             TelephoneEntreprise        = :tel,
             CPEntreprise               = :cp
		WHERE
			IdEntreprise                = :id
		';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);

            $c->bindParam(':id', $this->Id, PDO::PARAM_INT);

            $c->bindParam(':nom', $this->Nom, PDO::PARAM_STR);
            $c->bindParam(':ad1', $this->Adresse1, PDO::PARAM_STR);
            $c->bindParam(':ad2', $this->Adresse2, PDO::PARAM_STR);
            $c->bindParam(':vil', $this->Ville, PDO::PARAM_STR);
            $c->bindParam(':ma', $this->Mail, PDO::PARAM_STR);
            $c->bindParam(':si', $this->Site, PDO::PARAM_STR);
            $c->bindParam(':des', $this->Description, PDO::PARAM_STR);
            $c->bindParam(':tel', $this->Tel, PDO::PARAM_STR);

            $c->bindParam(':cp', $this->CP, PDO::PARAM_INT);
            $c->bindParam(':idZ', $this->IdZone, PDO::PARAM_INT);

            if ($c->execute())
            {
                $sql->commit();
                $c->closeCursor();
                $this->requeteOk = true;
                $this->errormsg = "Modification reussie!";
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
            }
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
        }
    }

    /*     * ************** Fonction hors-classe ***************** */

    /**
     * @return <mixed Array d'Entreprise
     * @static
     */
    static public function getList($limit=0, $begin=0)
    {
        if (empty($limit))
        {
            $sql = SQL::getInstance()->getConnection();
            $query = 'SELECT * FROM Entreprise ORDER BY NomEntreprise';
            $c = $sql->prepare($query);
            $c->execute();
            $result = $c->fetchAll(PDO::FETCH_OBJ);
            return $result;
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            $query = 'SELECT *
                      FROM Entreprise ORDER BY NomEntreprise';
            $query .= ' LIMIT :begin,:limit';
            $c = $sql->prepare($query);
            $c->bindParam(':begin', $begin, PDO::PARAM_INT);
            $c->bindParam(':limit', $limit, PDO::PARAM_INT);
            if ($c->execute())
            {
                $result = $c->fetchAll(PDO::FETCH_OBJ);
                return $result;
            }
            else
            {
                return array();
            }
        }
    }

    /**
     * @return <mixed Array de contact entreprise
     * @static
     */
    static public function getListContactByEntreprise($id) {
        if (!empty($id)) {
            $sql = SQL::getInstance()->getConnection();
            $query = "SELECT idContactEntreprise, NomUtilisateur, PrenomUtilisateur
                          FROM Entreprise e
                          INNER JOIN ContactEntreprise c ON c.IdEntreprise = e.IdEntreprise
                          INNER JOIN Utilisateur u ON u.IdUtilisateur = c.idContactEntreprise
                          WHERE e.IdEntreprise = :id";
            $c = $sql->prepare($query);
            $c->bindParam(':id', $id, PDO::PARAM_INT);
            if ($c->execute())
            {
                $result = $c->fetchAll(PDO::FETCH_OBJ);
                return $result;
            }
            else
            {
                return array();
            }
        }
    }

    /**
     * @static
     * @return int nombre total d'entreprise
     */
    static public function globalCount()
    {
        $sql = SQL::getInstance()->getConnection();

        $query = "SELECT COUNT(IdEntreprise) as count FROM Entreprise";
        $c = $sql->query($query);
        $result = $c->fetch(PDO::FETCH_OBJ);
        return $result->count;
    }

    //************** Getter et Setter **********************
    /**
     *
     * @return int
     */
    public function getIdEntreprise()
    {
        return $this->Id;
    }

    public function getIdZone()
    {
        return $this->IdZone;
    }

    public function setIdZone($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "")
        {
            $this->IdZone = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id zone ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'id zone ne peut etre vide !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cet id zone n'est pas valide !";
            }

            $this->IdZone = 0;
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getNomEntreprise()
    {
        return stripcslashes($this->Nom);
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setNomEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 255)
        {
            $this->Nom = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le nom ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le nom ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le nom ne peut etre aussi long !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce nom n'est pas valide !";
            }

            $this->Nom = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getAdresse1Entreprise()
    {
        return stripcslashes($this->Adresse1);
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setAdresse1Entreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 255)
        {
            $this->Adresse1 = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre aussi longue !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cette adresse n'est pas valide !";
            }

            $this->Adresse1 = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getAdresse2Entreprise()
    {
        return stripcslashes($this->Adresse2);
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setAdresse2Entreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 255)
        {
            $this->Adresse2 = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'adresse ne peut etre aussi longue !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cette adresse n'est pas valide !";
            }

            $this->Adresse2 = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getVilleEntreprise()
    {
        return stripcslashes($this->Ville);
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setVilleEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 255)
        {
            $this->Ville = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La ville ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La ville ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La ville ne peut etre aussi longue !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cette ville n'est pas valide !";
            }

            $this->Ville = "";
        }
        return $errTab;
    }

    /**
     * Adresse complète sur une ligne
     * @return string
     */
    public function getAdresseEntiereEntreprise()
    {
        return $this->Adresse1 + " " + $this->Adresse2 + " " + $this->Ville + " " + $this->CP;
    }

    /**
     *
     * @return string
     */
    public function getMailEntreprise()
    {
        return $this->Mail;
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setMailEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");
        $regmail = "^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*\.(([a-zA-Z]{2,3})|(aero|coop|info|museum|name|gouv))$^";

        if (isset($value) && $value != "" && strlen($value) <= 255 && preg_match($regmail, $value))
        {
            $this->Mail = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le mail ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le mail ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le mail ne peut etre aussi long !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce mail n'est pas valide !";
            }

            $this->Mail = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getSiteEntreprise()
    {
        return $this->Site;
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setSiteEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 255)
        {
            $this->Site = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le site ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le site ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 255)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le site ne peut etre aussi long !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce site n'est pas valide !";
            }

            $this->Site = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getDescriptionEntreprise()
    {
        return stripcslashes($this->Description);
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setDescriptionEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "")
        {
            $this->Description = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La description ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "La description ne peut etre vide !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cette description n'est pas valide !";
            }

            $this->Description = "";
        }
        return $errTab;
    }

    /**
     *
     * @return string
     */
    public function getTelephoneEntreprise()
    {
        return $this->Tel;
    }

    /**
     *
     * @param string $value
     * @return mixed
     */
    public function setTelephoneEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) <= 30)
        {
            $this->Tel = htmlentities($value);
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le telephone ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le telephone ne peut etre vide !";
            }
            if (isset($value) && strlen($value) > 30)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le telephone ne peut etre aussi long !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce telephone n'est pas valide !";
            }

            $this->Tel = "";
        }
        return $errTab;
    }

    /**
     *
     * @return int
     */
    public function getCPEntreprise()
    {
        if (!empty($this->CP) && strlen($this->CP) == 4)
            $this->CP = "0" . $this->CP;
        return $this->CP;
    }

    /**
     *
     * @param int $value
     * @return mixed
     */
    public function setCPEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value != "" && strlen($value) < 6)
        {
            $this->CP = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le code postale ne peut etre null !";
            }
            if (isset($value) && $value == "")
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le code postale ne peut etre vide !";
            }
            if (isset($value) && strlen($value) >= 6)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Le code postale ne peut etre aussi long !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Ce code postale n'est pas valide !";
            }

            $this->CP = 0;
        }
        return $errTab;
    }

}